home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 4 / Apprentice-Release4.iso / Source Code / C / Applications / Portable Patmos / src / portable kernel / mac / 68XXX.c < prev    next >
Encoding:
C/C++ Source or Header  |  1995-08-30  |  4.0 KB  |  209 lines  |  [TEXT/KAHL]

  1. #include "crtlocal.h"
  2. #include "proc_mmu.h"
  3.  
  4. long get_68020_tc()
  5. {
  6. return 0;
  7. }
  8. void get_68020_crp(long *vec)
  9. {
  10. vec[0] = 127;
  11. vec[1] = 0;
  12. }
  13. void get_68020_srp(long *vec)
  14. {
  15. vec[0] = 127;
  16. vec[1] = 0;
  17. }
  18. void put_68020_crp(long *vec)
  19. {
  20. }
  21. void flush_68020_caches(void)
  22. {
  23. }
  24. void flush_68020_mmu_caches(void)
  25. {
  26. }
  27. pascal void trap_patch_68020_0(void)
  28. {
  29. ;
  30. {
  31. struct userregs save;
  32. asm {
  33. movem.l d0-d7/a0-a5,save.save
  34. move.l (a6),save.save[14]
  35. move.w 4(a6),save.flags
  36. move.l 6(a6),save.pc
  37. };
  38. SetCurrentA5();
  39. save.save[15] = usp();
  40. kernel_memcpy(system_vectors, supervisor_vectors, vec_patch_size);
  41. if (0x2000&~save.flags)
  42. {
  43. crp->registers = save;
  44. crp->state = 'D';
  45. }
  46. else if (crp) crp->state = 'R';
  47. }
  48. sched();
  49. {
  50. struct userregs save = crp->registers;
  51. put_usp(save.save[15]);
  52. kernel_memcpy(system_vectors, user_vectors, vec_patch_size);
  53. ;
  54. ;
  55. asm
  56. {
  57. move.l save.save[14],(a6)
  58. move.w save.flags,4(a6)
  59. move.l save.pc,6(a6)
  60. movem.l save.save,d0-d7/a0-a5
  61. unlk a6
  62. rte
  63. };
  64. }
  65. }
  66. pascal void trap_patch_68020_1(unsigned short fault)
  67. {
  68. unsigned short kind;
  69. long newstacksize,phys_pc;
  70. struct userregs save;
  71. ;
  72. asm {
  73. movem.l d0-d7/a0-a5,save.save
  74. };
  75. SetCurrentA5();
  76. kernel_memcpy(system_vectors, supervisor_vectors, vec_patch_size);
  77. {
  78. int i,k;
  79. unsigned short ssw,*fault_frame = &fault;
  80. save.save[15] = usp();
  81. asm {
  82. move.l (a6),save.save[14]
  83. move.w 4(a6),save.flags
  84. move.l 6(a6),save.pc
  85. move.w 10(a6),kind
  86. };
  87. k = kind >> 12;
  88. kind &= 4095;
  89. if (crp->trace_me && (0x2000&~save.flags)
  90. && (((kind)==(9<<2))||((kind)==(47<<2))))
  91. {
  92. save.flags &= ~0xC000;
  93. crp->registers = save;
  94. crp->state = 'T';
  95. crp->result = W_STOPCODE(SIGTRAP);
  96. sched();
  97. }
  98. else
  99. {
  100. crp->result = SIGTERM;
  101. if (!crp->trace_me)
  102. {
  103. debug = 0;
  104. kprintf("Saved PC = %X USP = %X URP = %X SR = %X\n",
  105. save.pc,
  106. save.save[15],
  107. (long)crp, save.flags);
  108. kprintf("Exception vector = %X, kind = %d\n",
  109. kind, k);
  110. for (i = 0; i < 8; i++)
  111. kprintf("D%d = %8.8X    A%d = %8.8X\n", i, save.save[i], i, save.save[i+8]);
  112. }
  113. switch ((kind)>>2)
  114. {
  115. case 32: case 33: case 34: case 35:
  116. case 36: case 37: case 38: case 39:
  117. case 40: case 41: case 42: case 43:
  118. case 44: case 45: case 46: case 47:
  119. crp->result = SIGTRAP;
  120. if (!crp->trace_me) kprintf("trap #%d \n", ((kind)>>2)-32);
  121. break;
  122. case 2:
  123. if (!crp->trace_me)
  124. {
  125. int i,addr;
  126. kprintf("bus error - Fault frame:\n");
  127. for (i = 4; i < 14; i++)
  128. {
  129. kprintf("%4.4X ", fault_frame[i]);
  130. }
  131. ssw = fault_frame[4];
  132. addr = *(long *)&fault_frame[8];
  133. kprintf("\nAccessing fault address %8.8X (kmem=%8.8X)\n", addr, LTP(addr));
  134. }
  135. crp->result = SIGBUS;
  136. break;
  137. case 3: if (!crp->trace_me) kprintf("address error\n");
  138. crp->result = SIGBUS; break;
  139. case 4: if (!crp->trace_me) kprintf("illegal inst\n");
  140. crp->result = SIGILL; break;
  141. case 5: if (!crp->trace_me) kprintf("zero divide\n");
  142. break;
  143. case 6: if (!crp->trace_me) kprintf("range error\n");
  144. break;
  145. case 7: if (!crp->trace_me) kprintf("trapv\n");
  146. break;
  147. case 8: if (!crp->trace_me) kprintf("privilege\n");
  148. break;
  149. case 9: if (!crp->trace_me) kprintf("trace\n");
  150. break;
  151. case 10: if (!crp->trace_me) kprintf("line-A emulation\n");
  152. crp->result = SIGEMT; break;
  153. case 11: if (!crp->trace_me) kprintf("Line-F emulation\n");
  154. crp->result = SIGEMT; break;
  155. }
  156. if (!crp->trace_me)
  157. {
  158. phys_pc = (long)LTP(save.pc);
  159. if (phys_pc != -1) insn_surround(save.pc);
  160. else kprintf("Program address not mapped\n");
  161. }
  162. if (0x2000&~save.flags)
  163. {
  164. int trace = crp->trace_me;
  165. if (!trace)
  166. crp->state = 'X';
  167. else
  168. {
  169. crp->state = 'T';
  170. crp->result = W_STOPCODE(crp->result);
  171. }
  172. sched();
  173. if (!trace) kprintf("Restored PC = %X USP = %X URP = %X\n",
  174. crp->registers.pc,
  175. crp->registers.save[15],
  176. (long)crp);
  177. }
  178. else
  179. {
  180. kprintf("Exception occurred in supervisor mode\n");
  181. kInterval = 0;
  182. __exit(1);
  183. }
  184. }
  185. save = crp->registers;
  186. put_usp(save.save[15]);
  187. kernel_memcpy(system_vectors, user_vectors, vec_patch_size);
  188. ;
  189. ;
  190. asm
  191. {
  192. move.l save.save[14],(a6)
  193. move.w save.flags,4(a6)
  194. move.l save.pc,6(a6)
  195. movem.l save.save,d0-d7/a0-a5
  196. unlk a6
  197. rte
  198. };
  199. }
  200. kprintf("New stack size = %d pages\n", newstacksize/page_size);
  201. kernel_memcpy(system_vectors, user_vectors, vec_patch_size);
  202. asm
  203. {
  204. movem.l save.save,d0-d7/a0-a5
  205. unlk a6
  206. rte
  207. };
  208. }
  209.